import { Random } from 'mockjs';
import { parse } from 'url';

// 所属专业
const specialities = {
  ch: '测绘',
  yg: '遥感',
  zh: '自环',
  cx: '城乡',
  dx: '地信',
  tg: '土管',
};

// 政治面貌
const politicalOutlooks = {
  partyMember: '中共党员',
  probationaryPartyMember: '中共预备党员',
  LeagueMember: '共青团员',
  masses: '群众',
};

const memos = [
  '-',
  Random.csentence(3, 5),
  Random.csentence(3, 5),
  Random.csentence(3, 5),
  Random.csentence(3, 5),
  Random.csentence(3, 5),
];

let studentList = [];

/**
 * mock 学生列表
 *    按照年级划分
 */
for (let i = 0; i < 324; i += 1) {
  const std = {
    id: Random.guid(), // 用户ID
    key: Random.id(), // key  身份证号
    name: Random.cname(), // 姓名
    sex: Random.boolean(), // 性别
    age: Random.natural(18, 23), // 年龄
    college: '测绘与国土信息工程学院',
    speciality: Object.keys(specialities)[i % 6], // 所属专业
    classes: Random.natural(1, 5), // 班级
    grade: Random.natural(2015, 2018), // 年级
    gpa: Random.float(2.5, 4.0, 1, 1), // 绩点
    politicalOutlook: Object.keys(politicalOutlooks)[Random.natural(0, 3)], // 政治面貌
    createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i),
    updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i),
  };

  std.avatar = Random.image('50x50', '#228cee', '#FFFFFF', std.name.substr(0, 1));
  studentList.push(std);
}

// Mock 操作日志列表
function mockOperations(name) {
  const res = {};

  for (let index = 0; index < 3; index += 1) {
    const eachCount = Random.integer(3, 10);
    const eachResult = [];

    for (let i = 0; i < eachCount; i += 1) {
      const obj = {
        key: Random.guid(),
        type: Random.ctitle(3, 5),
        name,
        status: ['agree', 'disagree'][Random.integer(0, 1)],
        updatedAt: Random.datetime(),
        memo: memos[Random.integer(0, 5)],
      };

      eachResult.push(obj);
    }
    res[`tab${index + 1}`] = eachResult;
  }

  return res;
}

function mockNsphs(count) {
  const ret = [];
  for (let i = 0; i < count; i += 1) {
    ret.push({
      title: `第${i + 1}学年`,
      score: Random.natural(65, 85),
    });
  }

  return ret;
}

function getFakeStudentList(req, res, u) {
  let url = u;
  if (!url || Object.prototype.toString.call(url) !== '[object String]') {
    // eslint-disable-next-line prefer-destructuring
    url = req.url;
  }

  const params = parse(url, true).query;
  let dataSource = studentList;

  // 排序
  if (params.sorter) {
    const s = params.sorter.split('_');

    dataSource = dataSource.sort((prev, next) => {
      if (s[1] === 'descend') {
        return next[s[0]] - prev[s[0]];
      }
      return prev[s[0]] - next[s[0]];
    });
  }

  // 姓名搜索
  if (params.name) {
    dataSource = dataSource.filter(data => data.name.indexOf(params.name) > -1);
  }

  if (params.speciality) {
    dataSource = dataSource.filter(data => data.speciality === params.speciality);
  }

  if (params.grade) {
    dataSource = dataSource.filter(data => data.grade === params.grade);
  }

  // 班级
  if (params.classes) {
    dataSource = dataSource.filter(data => data.classes === +params.classes);
  }

  // 政治面貌
  if (params.politicalOutlook) {
    dataSource = dataSource.filter(data => data.politicalOutlook === params.politicalOutlook);
  }

  let pageSize = 20;
  if (params.pageSize) {
    pageSize = params.pageSize * 1;
  }

  const result = {
    list: dataSource,
    pagination: {
      total: dataSource.length,
      pageSize,
      current: parseInt(params.currentPage, 10) || 1,
    },
  };
  return res.json(result);
}

function postFakeStudentList(req, res, u, b) {
  let url = u;
  if (!url || Object.prototype.toString.call(url) !== '[object String]') {
    // eslint-disable-next-line prefer-destructuring
    url = req.url;
  }

  const body = (b && b.body) || (req.body.body ? req.body.body : req.body);

  const { id = '0', name, speciality, age, sex, classes, grade, politicalOutlook, key = [] } = body;

  const method = body.method ? body.method : req.body.method;

  switch (method) {
    case 'delete':
      studentList = studentList.filter(item => key.every(k => k !== item.key));
      break;
    case 'update':
      studentList = studentList.map(item => {
        if (item.id === id) {
          Object.assign(item, {
            name,
            age,
            sex,
            speciality,
            classes,
            grade,
            politicalOutlook,
            updatedAt: new Date().getTime(),
          });
        }
        return item;
      });
      break;
    case 'post':
      // TODO: 新建学生信息

      /**
       * 表单字段
       *  key               身份证号
       *  name              姓名
       *  age               年龄
       *  sex               性别
       *  speciality        专业
       *  classes           班级
       *  grade             年级
       *  politicalOutlook  政治面貌
       *  birthDate         出生年月
       *  nativePlace       籍贯
       *
       *  contactNumber     手机号
       *  email             邮箱
       *  wechat            微信号
       *  qq                qq
       *  postalAddress     通讯地址
       *
       *  nichname          用户昵称
       *  password          账户密码
       *  role              账户类型
       *
       *  TODO: 增加 各科成绩
       *
       *  TODO: 获奖需要审批流程
       */

      studentList.unshift({
        id: Random.guid(), // 用户ID
        gpa: Random.float(2.5, 4.0, 1, 1), // 绩点
        college: '测绘与国土信息工程学院',
        createdAt: new Date().getTime(),
        updatedAt: new Date().getTime(),
        avatar: Random.image('100x100', '#228cee', '#FFFFFF', name.substr(0, 1)),
        key,
        name,
        age,
        sex,
        speciality,
        classes,
        grade,
        politicalOutlook,
      });
      break;
    default:
      break;
  }

  return getFakeStudentList(req, res, u);
}

function getFakeStudentDetail(req, res) {
  const { key } = req.query;
  const studentInfo = studentList.filter(item => item.key === key);

  const name = studentInfo[0].name || '佚名';

  const userInfo = {
    ...studentInfo[0],
    birthDate: Random.date('yyyy-MM-dd'), // 出生年月
    nativePlace: Random.county(true), // 籍贯
    contactNumber: `1${[3, 5, 7, 8][Random.natural(0, 3)]}${Random.natural(100000000, 999999990)}`, // 联系电话
    email: Random.email('hpu.edu.cn'), // 邮箱
    qq: Random.natural(100000000, 2999999999), // qq
    wechat: Random.natural(10000000000, 19999999999), // 微信号
    postalAddress: Random.county(true), // 通讯地址
    operations: mockOperations(name),

    // 课程成绩部分
    courseAchievementScore: Random.float(60, 100, 2, 2), // 课程学习分
    academicAwardScore: 0, // 学习奖励分

    // 思想品德分
    moralEducationBasis: 60, // 思想品德基础分
    matualEvaluation: 20, // 学生互评分
    politicalTheory: 20, // 政治理论学习分

    // 体育分
    averageNsphs: Random.natural(69, 90), // 国家学生体质健康标准 平均分
    nsphs: mockNsphs(2019 - studentInfo[0].grade), // 每一年的体质达标测试分数

    // 荣誉称号及活动获奖分
    honoraryTitle: Random.natural(0, 5), // 各级各类荣誉称号加分
    secondClassroom: Random.natural(0, 1), // 第二课堂比赛活动获奖加分
    otherBonus: Random.natural(0, 2), // 其他加分

    // 班级名次
    classRanking: Random.natural(1, 30),
    // 专业名次
    specialityRanking: Random.natural(5, 60),
    // 必修课最低成绩
    minimumAchievementsInCompulsoryCourses: Random.natural(60, 72),

    // 综合评定积分
    comprehensiveEvaluation: Random.float(60, 100, 2, 2),
    // 素质扩展分
    qualityExpansion: Random.natural(1, 7),
  };

  res.json(userInfo);
}

export default {
  'GET /api/students/detail': getFakeStudentDetail, // 获取 学生详情
  'GET /api/students': getFakeStudentList, // 获取 studentList
  'POST /api/students': postFakeStudentList, // 增加、更新、删除学生 ==> 返回为新的 studentList
};
